home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1990: Night of the Living Disc / Night of the Living Disc.2mg / Dev.CD.5 / Apple.Software / Licensable.Code / PRINT.DRIVER / IMAGE.HIRES < prev   
Encoding:
Text File  |  1985-02-15  |  15.0 KB  |  554 lines  |  [04] ASCII Text (0x2000)

  1. *--------------------------------
  2. *              IMAGER
  3. *
  4. *
  5. * IMAGER PRODUCES A HARDCOPY
  6. * IMAGE OF THE APPLE II HIRES
  7. * SCREEN ON APPLE'S IMAGEWRITER
  8. * PRINTER.
  9. *
  10. * PRINTER CARD CAN BE A SUPER SERIAL CARD,
  11. *  OR THE SERIAL PORT OF
  12. * THE APPLE ///.
  13. *
  14. * POKE ZERO-PAGE BYTE 06 WITH SLOT
  15. * NUMBER.  SLOT IS ADJUSTED TO 1
  16. * IF BYTE 6 = 0, 7 IF >7.
  17. *
  18. * SET ZERO-PAGE BYTE 07 TO ONE OF
  19. * THE FOLLOWING VALUES BEFORE EACH
  20. * SCREENDUMP UTILITY CALL:
  21. *   0 - SINGLE-SIZE, WHITE-ON-BLACK
  22. *   1 - BLACK-ON-WHITE
  23. *   2 - DOUBLE-SIZE, WHITE-ON-BLACK
  24. *   3 - BLACK-ON-WHITE
  25. *
  26. *   BIT 0 - WHITE-ON-BLACK/BLACK-ON-WHITE
  27. *   BIT 1 - SINGLE/DOUBLE-SIZED PICTURE
  28. * NOTE THAT BITS ARE ROTATED
  29. *  --> B1,B0 BECOME B7,B6 FOR BIT TEST
  30. *
  31. *   APG, APPLE COMPUTER - AUGUST 1984
  32. *    - R. HOIBERG & M. HELLER
  33. *
  34. *
  35. *--------------------------------
  36. *
  37. *
  38. * ZERO-PAGE DATA -
  39. SLOT EQU 06 ;PARALLEL CARD SLOT
  40. XFRFLGS EQU 07 ; THIS IS THE PARAMETER BYTE...
  41. ; THIS CONTAINS THE SIZE/INVERT PRINT OPTIONS
  42. GCHAR EQU 06 ;APPLE DMP GRAPHICS CHAR (1X8 CELL)
  43. BITMASK EQU 08 ;MASKS OFF ALL BUT DESIGNATED BIT IN GR BYTE
  44. TEMP EQU 09 ; DOUBLE-SIZE FLIP-FLOP, NON-ZERO WHEN THE
  45. ; BYTE JUST PRINTED ONLY CONTAINS THE TOP
  46. ; HALF OF A 1H BY 8V PIXEL AREA.
  47. CSWL EQU $36
  48. WARMSTART EQU $3D0
  49. VDOSIO EQU $BE34
  50. DOSIO EQU $03EA
  51. HINDEX EQU $1B ; THIS COUNTS THE HI-RES VERTICAL BLOCKS AS
  52. ; THEY ARE PRINTED (A VERTICAL BLOCK IS
  53. ; 7 DOTS (1 BYTE) WIDE BY 8 DOTS TALL).
  54. TBLINDEX EQU $1C ; A POINTER TO THE ADDRESS IN THE TABLE WHICH
  55. ; CONTAINS THE BASE ADDRESS OF THE HORIZONTAL
  56. ; BLOCK BEING PRINTED (HORZ. BLOCK IS 280 DOTS
  57. ; WIDE BY 8 DOTS TALL - BASE ADDRESS IS
  58. ; ADDRESS OF UPPER-LEFTMOST DOT).
  59. LASTEMP EQU $CF ; STORES THE VALUE OF TEMP AT THE END OF EVERY
  60. ; PRINTER LINE, SO WE HAVE IT LATER
  61. HBASE EQU $19 ; 2-BYTES ($19,$1A) HOLD LOW AND HI BYTES OF
  62. ; HI-RES ROW BASE ADDRESS
  63. PPSTAT EQU $C084 ;ADDR OF PARALLEL PRINTER STATUS BYTE
  64. PPDATA EQU $C080 ;ADDR OF PARALLEL PRINTER DATA BYTE
  65. OUTL EQU $FA
  66. OUTH EQU $FB
  67. OFFSET EQU $FC
  68. FINISHED EQU $FF
  69. SIGBYTES EQU $FE *AND $FF
  70. COMBYTE EQU $E74C
  71. BYTE EQU $E74F
  72. SSCDATA EQU $C088
  73. SSCSTAT EQU $C089
  74. SW1 EQU $C081
  75. SSCCOMM EQU $C08A
  76. SSCCONT EQU $C08B
  77. VIDOFF EQU $CFFF ; 80-COL CARD VECTOR
  78. OUTPRT EQU $FE95
  79. SETVID EQU $FE93
  80. APP3ID EQU $FA68
  81. COUT EQU $FDED
  82. SIGBYTE EQU $C00B
  83. ;
  84. SIGBYTE2 EQU $C00C
  85. *
  86. *                     >>> CONSTANTS <<<
  87. *
  88. *
  89. HNDXMAX EQU $28 ;$28 BYTES PER HI-RES SCREEN ROW
  90. ;
  91. ; DMP CONTROL CHARACTERS -
  92. NUL EQU $00 ;1ST XMIT CHAR IN CASE PTR POWERED ON
  93. LF EQU $0A ;LINEFEED
  94. CR EQU $0D ;CARRAIGE RETURN
  95. ESC EQU $1B ;ASCII 'ESCAPE' CHAR
  96. ASCII1 EQU $31
  97. ASCII6 EQU $36
  98. ASCIIA EQU $41 ;ESC A FOR 1/6" LF
  99. ASCIID EQU $44 ;ESC D N1 N0  TO OPEN DIP SWITCH
  100. ASCIIF EQU $46 ;ESC F nnnn FOR ABSOLUTE CURSOR ADDRESSING
  101. ASCIIG EQU $47 ;ESC G nnnn FOR DOT GRAPHICS COLUMNS
  102. ASCIIn EQU $6E ;ESC n FOR EXTENDED (9 CPI) PRINTING
  103. ASCIIT EQU $54 ;ESC T NN FOR NN/144" LF
  104. *
  105.  ORG $1B00
  106.  JMP GrafBas ;ENTRY POINT FOR APPLESOFT BASIC
  107.  JMP GrafML ;MACHINE LANGUAGE ENTRY POINT
  108. ;Y REGISTER CONTAINS SLOT
  109. ;X REGISTER CONTAINS OPTION
  110. HINDEXL DS 1 ; VT. BLK. OF LEFT SIDE OF IMAGE
  111. HINDEXR DS 1 ; VT. BLK. OF RIGHT SIDE OF IMAGE
  112. PRFLG DS 1 ; MSB SET WHEN PRINTING, CLEAR WHEN SCANNING
  113. BINL DS 1 ; USED BY HEXDEC ROUTINE
  114. BINH DS 1 ; USED BY HEXDEC ROUTINE
  115. MYBUF DS 4 ; USED BY HEXDEC, BKTODOTS ROUTINES
  116. *
  117. GrafML EQU *
  118.  LDA #0
  119.  STA VIDOFF ; RELEASE 80-COL CARD USE OF C800-CA00
  120.  JSR FINDTYPE
  121.  LDA #ESC ; SET UP LEFT-TO-RIGHT PRINTING ONLY
  122.  JSR OUTPUT
  123.  LDA #'>'
  124.  JSR OUTPUT
  125. *                              ;SET UP STATUS AND DATA ADDRESSES
  126.  LDA XFRFLGS ;ADJUST XFROPTION BITS FOR EASIER TESTING
  127.  ROR  ;C:=WHITE-ON-BLACK/BLACK-ON-WHITE
  128.  ROR  ;C:=SINGLE/DOUBLE SIZE
  129.  ROR
  130.  AND #$C0 ;RESET REMAINING BITS
  131.  STA XFRFLGS ;B7,B6:=B1,B0
  132. ;
  133. ; CLEAR PRINTER BUFFER
  134.  LDA #CR ;CLEAR BUFFER FOR GRAPHICS CHARS
  135.  JSR OUTPUT
  136. ;
  137.  LDA #ESC ; SET EXTENDED (9 CPI) MODE FOR 72 DPI
  138.  JSR OUTPUT ; HORIZONTAL RESOLUTION.
  139.  LDA #ASCIIn
  140.  JSR OUTPUT
  141.  LDA #ESC ; ESC T 1 6 --> SET VERTICAL LINE FEED FOR
  142.  JSR OUTPUT ; 16/144", FOR 72 DPI VERTICAL RESOLUTION.
  143.  LDA #ASCIIT
  144.  JSR OUTPUT
  145.  LDA #ASCII1
  146.  JSR OUTPUT
  147.  LDA #ASCII6
  148.  JSR OUTPUT
  149. ;
  150.  LDA #0
  151.  STA TBLINDEX ; INTIALIZE TABLE INDEX TO TOP OF SCREEN
  152.  STA LASTEMP ; INITIALIZE LAST FLIP-FLOP STATUS TO ZERO.
  153. ;
  154. ; FOR EVERY ROW -
  155. NEWLINE LDA #0
  156.  STA HINDEX ;INIT HIRES ROW BYTE COUNTER
  157.  STA PRFLG ; INITIALIZE PRFLG TO SCAN RATHER THAN PRINT
  158.  LDA #$FF ; INITIALIZE LEFT SIDE OF IMAGE MARKER
  159.  STA HINDEXL
  160. NEWVTBLK LDA #1
  161.  STA BITMASK ;INIT TO MASK OUT ALL BUT BYTE'S
  162. ; LEFT-MOST PIXEL
  163. NEWCLMN LDA LASTEMP
  164. NEWCLM2 STA TEMP ; RESTORE TEMP FROM END OF LAST LINE - TELLS
  165. ; WHERE WE ARE IN PRESENT SCREEN BYTE
  166. ; (AT BEGINNING OF NEW, OR MIDDLE OF LAST).
  167. NEWBYTE LDY TBLINDEX ; GET THE TABLE OFFSET...
  168.  LDA TABLE,Y ; FETCH LOW-ORDER HBASE
  169.  STA HBASE ; STORE IT
  170.  LDA TABLE+1,Y ; FETCH HI-ORDER HBASE
  171.  LDX LASTEMP ; CHECK IF IN MIDDLE OF 1 BY 8 PIXEL BLOCK?
  172.  BEQ NEWBYT0 ; NO, WE DON'T ALTER HI-ORDER HBASE
  173.  CLC  ; YES, IN MIDDLE, SO ADD $10 TO HI-ORDER HBASE
  174.  ADC #$10 ;     SO WE START READING FROM RIGHT PLACE.
  175. NEWBYT0 STA HBASE+1 ; STORE THE HBASE
  176. NEWBYT1 LDA #0
  177.  STA GCHAR ; CLEAR THE BYTE WE'LL SEND TO PRINTER
  178.  LDX #8 ; IF REGULAR SIZE, THERE ARE 8 SCREEN DOTS
  179.  BIT XFRFLGS ; IN EVERY PRINTER BYTE. IF DOUBLE SIZE, THERE
  180.  BPL NEWBIT ; ARE ONLY 4 DOTS/PRINTER BYTE.
  181.  LDX #4
  182. NEWBIT LDY HINDEX ; GET MEM GRAPHICS BYTE INTO ACC, AND STRIP
  183.  LDA (HBASE),Y ; OFF ALL BITS EXCEPT THE ONE CORRESPONDING
  184.  AND BITMASK ; TO DOT WE'RE CHECKING...
  185.  CMP #1 ;C:=1 IF GR BUFFER BIT IS ON
  186.  ROR GCHAR ; PUT CARRY INTO BYTE WE'LL SEND TO PRINTER
  187.  BIT XFRFLGS
  188.  BPL NEWBIT1
  189.  CMP #1 ; REPEAT BIT IF DOUBLE SIZE...
  190.  ROR GCHAR
  191. NEWBIT1 DEX  ; ANOTHER SCRN DOT MOVED INTO GCHAR
  192. NEXTBIT TXA
  193.  BEQ NEXTBYTE ; GCHAR FILLED, SEND AND MOVE ON!
  194. NXTBIT1 LDA HBASE+1 ; GET HIGH-ORDER HIRES ROW BASE
  195.  CLC
  196.  ADC #4 ; ADD 4, SO WE'LL POINT AT NEXT ROW
  197.  STA HBASE+1 ; PUT NEW ROW BASE BACK
  198.  JMP NEWBIT ; GO BACK AND GET NEXT PIXEL DOWN
  199. NEXTBYTE LDA GCHAR
  200.  BIT XFRFLGS
  201.  BVS NXBYT0
  202.  EOR #$FF ; INVERT GR BYTE IF PARAMATER TELLS US TO
  203.  STA GCHAR
  204. NXBYT0 BIT PRFLG ; ARE WE PRINTING, OR JUST SCANNING?
  205.  BPL GOSCAN ; IF SCANNING, GO TO SCAN ROUTINE...
  206.  JSR OUTPUT ; OTHERWISE PRINT THE GR BYTE
  207.  JMP NXTBYTRT
  208. GOSCAN JMP PICSCAN ; SCANNING, JUMP TO CHAR SCAN ROUTINE
  209. NXTBYTRT BIT XFRFLGS ; IF WE'RE DOING REGULAR SIZE, WE DON'T
  210.  BPL NXTBYT2D ; HAVE TO MESS WITH THE FLIP-FLOP...
  211.  BIT PRFLG ; IF NOT PRINTING, DON'T BOTHER SENDING TWICE
  212.  BPL NXTBYT2
  213.  LDA GCHAR
  214.  JSR OUTPUT ; DOUBLE SIZE, SEND COLUMN AGAIN...
  215. NXTBYT2 LDA TEMP ; FOR DOUBLE SIZE, WE XOR THE FLIP-FLOP - IT
  216.  EOR #1 ; BECOMES ONE IF MIDWAY THROUGH 1x8 PIXEL
  217.  STA TEMP ; BLOCK, OR ZERO IF ALL THROUGH WITH BLOCK.
  218. NXTBYT2D ASL BITMASK ; NOW WE'LL MOVE ONE PIXEL OVER ON SCREEN
  219.  BIT BITMASK
  220.  BMI NXTBYT3 ; IF WE'VE DONE 7 BITS ACROSS, GO START ON NEXT
  221. ; VERTICAL BLOCK (7 PIXELS H BY 8 BITS V).
  222.  JMP NEWCLMN ; IF NOT, START ON NEXT COLUMN OF BITS OVER.
  223. NXTBYT3 INC HINDEX
  224.  BIT PRFLG
  225.  BMI NXTBYT3A
  226.  JMP LINENDT ; SCAN ROUTINE HAS OWN LINE END TEST...
  227. NXTBYT3A LDY HINDEX ; NEXT ONE (7 PIXELS TO THE RIGHT)...
  228.  CPY HINDEXR ; ARE WE AT RIGHT SIDE OF IMAGE?
  229.  BCC DONXTBLK ; NOT DONE WITH LINE, DO NEXT BLK OVER...
  230.  BEQ DONXTBLK
  231.  JMP DONELINE
  232. DONXTBLK JMP NEWVTBLK
  233. DONELINE LDA #CR ; FINISHED A PRINTER LINE, SO...
  234.  JSR OUTPUT ; LET'S SEND A CARRIAGE RETURN
  235.  LDA #LF
  236.  JSR OUTPUT ; AND A LINEFEED TO THE IMAGEWRITER.
  237.  LDA TEMP ; STORE THE SIZE FLIP-FLOP SO WE KNOW WHERE
  238.  STA LASTEMP ; TO START READING FOR NEXT LINE.
  239. ; HORZ. BLOCK IS 280H BY 8V
  240.  BEQ NXTBYT5 ; IF NOT IN MIDDLE OF HORZ. BLOCK, WE
  241. ; INCREMENT THE TABLE POINTER TO NEXT BLOCK.
  242.  JMP NEWLINE ; DO NEXT LINE, STARTING IN MIDDLE OF BLOCK.
  243. NXTBYT5 LDA TBLINDEX ; GET LAST TABLE POINTER TO HBASE ADDRESS.
  244.  CLC
  245.  ADC #$02 ; MOVE POINTER TO POINT AT HBASE OF NEXT
  246. ; 280H BY 8V BLOCK DOWN ON SCREEN.
  247.  CMP #$30 ; THERE ARE 24 SUCH BLOCKS (24*2=48=$30)
  248.  BNE NXTBYT6 ; IF DONE, TIDY UP AND RETURN CONTROL TO DOS...
  249.  JMP FINI
  250. NXTBYT6 STA TBLINDEX ; PUT NEW TABLE INDEX BACK
  251.  JMP NEWLINE ; NOT DONE, START NEW LINE
  252. ;
  253. PICSCAN EQU * ; GBYTE SCAN ROUTINE TO FIND IMAGE EDGES
  254. FINDLFT BIT HINDEXL ; FOUND LEFT SIDE OF IMAGE YET?
  255.  BPL FINDRGT ; IF YES, WE ARE TO LOOK FOR RIGHT SIDE...
  256.  LDA GCHAR ; SEE IF LEFT SIDE BEGINS HERE.
  257.  BNE FINDLFT1 ; IF NOT, TEST FOR END OF LINE...
  258.  JMP NXTBYTRT
  259. FINDLFT1 LDA HINDEX ; IF IT DOES, WE SET HINDEXL TO VT BLOCK
  260.  STA HINDEXL ;  NUMBER WE ARE SCANNING.
  261.  JMP FINDRGT1
  262. FINDRGT LDA GCHAR ; SEE IF THIS IS POSSIBLE RIGHT EDGE OF IMAGE.
  263.  BEQ FINDRGT2 ; IF NOT, TEST FOR END OF LINE...
  264. FINDRGT1 LDA HINDEX ; IF YES, STORE VT BLOCK NUMBER IN HINDEXR.
  265.  STA HINDEXR
  266. FINDRGT2 JMP NXTBYTRT
  267. LINENDT LDA HINDEX ; CHECK TO SEE IF WE'RE AT END OF SCREEN ROW?
  268.  CMP #HNDXMAX ;  (40 BLOCKS ACROSS SCREEN)
  269.  BEQ PRTRCMDS ; IF YES, WE MUST TEST FURTHER...
  270.  JMP NEWVTBLK ; NO, THEN CONTINUE SCANNING LINE
  271. PRTRCMDS BIT HINDEXL ; DID WE EVER FIND LEFT EDGE OF IMAGE?
  272.  BMI DONELINE ; NO, JUST SEND CR/LF AND START NEXT LINE...
  273.  LDA HINDEXL ; HERE WE CONVERT BLOCK NUMBER INTO THE
  274.  JSR BKTODOTS ;  NUMBER OF DOTS TO TAB OVER...
  275.  LDY #4 ; NOW CONVERT HEX NUMBER OF DOTS IN THE
  276.  JSR HEXDEC ;  ASCII DECIMAL EQUIVALENT OF HEX NUMBERS...
  277.  LDA #ESC ; SEND PRINTER ESC F N3 N2 N1 N0
  278.  JSR OUTPUT ;  WHICH TELLS SCRIBE TO MOVE N3N2N1N0 DOTS
  279.  LDA #ASCIIF ;  OVER FROM LEFT MARGIN.
  280.  JSR OUTPUT
  281.  JSR OUTBUFF ; SEND N3 N2 N1 N0 TO PRINTER...
  282.  LDA HINDEXR ; NOW TELL SCRIBE HOW MANY COLUMNS TO PRINT.
  283.  SEC
  284.  SBC HINDEXL ; GET DIFFERENCE BETWEEN RIGHT AND LEFT SIDES.
  285.  CLC
  286.  ADC #1 ; ADD 1, SINCE WE SHOULD PRINT AT LEAST 1 BLK.
  287.  JSR BKTODOTS ; CONVERT TO NUMBER OF COLUMNS TO PRINT
  288.  LDY #4 ; NOW OBTAIN ASCII DECIMAL EQUIVALENT...
  289.  JSR HEXDEC
  290.  LDA #ESC ; SEND SCRIBE ESC C N3N2N1N0 FOR N3N2N1N0
  291.  JSR OUTPUT ;  COLUMNS OF HI-RES OUTPUT TO FOLLOW.
  292.  LDA #ASCIIG
  293.  JSR OUTPUT
  294.  JSR OUTBUFF ; SEND N3N2N1N0
  295.  LDA #$FF ; NOW SET PRFLG SO WE'LL ACTUALLY PRINT
  296.  STA PRFLG ;  ON OUR NEXT SCAN THROUGH LINE
  297.  LDA HINDEXL ; SET UP HINDEX SO SCAN STARTS AT LEFT EDGE
  298.  STA HINDEX ;  OF IMAGE.
  299.  JMP NEWVTBLK ; AND BEGIN PRINT SCAN...
  300. ;
  301. BKTODOTS EQU * ; CONVERTS VT BLK NO. TO NUMBER OF DOTS
  302. ;  VT BLK NO. IS PASSED IN ACCUMULATOR.
  303. ; RETURNS X=HIGH, A=LOW OF NUMBER OF DOTS.
  304.  STA MYBUF+1 ; STORE NUMBER OF VT. BLK.
  305.  LDX #0
  306.  STX MYBUF ; CLEAR HI-ORDER BYTE OF RESULT
  307.  ASL  ; WE MULTIPLE BLK. NUMBER BY 7 (7 PIXELS
  308.  ASL ;  ACROSS FOR EACH BLOCK) BY MULTIPLYING
  309.  ASL  ;  BY 8 AND SUBTRACTING ONCE.
  310.  ROL MYBUF ;  MULTIPLYING HI BYTE TOO...
  311.  SEC
  312.  SBC MYBUF+1 ; SUBTRACT VT BLK NO. ONCE (8*A-A=7A)
  313.  BCS BKTODOT1 ; IF NO UNDERFLOW, DON'T WORRY ABOUT HI BYTE
  314.  DEC MYBUF ; UNDERFLOW - SO BORROW ONE FROM HI BYTE
  315. BKTODOT1 BIT XFRFLGS ; IF DOUBLE-SIZE, WE HAVE TO DOUBLE THE
  316.  BPL BKTODOT2 ;  NUMBER OF DOTS YET AGAIN...
  317.  ASL
  318.  ROL MYBUF
  319. BKTODOT2 LDX MYBUF ; RETURN HI BYTE IN X REGISTER
  320.  RTS
  321. ;
  322. OUTBUFF EQU * ; SENDS 4 ASCII CHARS TO PRINTER STORED IN MYBUF
  323.  LDA #0
  324.  STA BINL
  325. OUTBUF1 LDX BINL
  326.  CPX #4
  327.  BEQ OUTBUF2
  328.  LDA MYBUF,X
  329.  JSR OUTPUT
  330.  INC BINL
  331.  JMP OUTBUF1
  332. OUTBUF2 RTS
  333. HEXDEC EQU * ; CONVERTS 16-BIT HEX NUMBER TO ASCII CODES
  334. ;  FOR DECIMAL EQUIVALENT.  A=LOW BYTE,
  335. ;  X=HI BYTE OF NUMBER TO CONVERT, AND
  336. ;  Y=NUMBER OF CHARS TO MAKE (WE WANT 4).
  337. ; OUTPUT IS STORED IN MYBUF, LAST CHAR FIRST.
  338.  STA BINL
  339.  STX BINH
  340. HDLOOP LDX #16+1 ; 16 BITS FIRST TIME DO NOTHING
  341.  LDA #0
  342.  CLC  ; C=0 SO FIRST ROL LEAVES A=0
  343. DV10LOOP ROL
  344.  CMP #10
  345.  BCC DV10LT ; BRANCH IF <
  346.  SBC #10 ; C=1 FROM CMP AND LEFT SET
  347. DV10LT ROL BINL
  348.  ROL BINH
  349.  DEX
  350.  BNE DV10LOOP
  351.  ORA #'0' ;MAKE ASCII
  352.  STA MYBUF-1,Y
  353.  DEY
  354.  BNE HDLOOP
  355.  RTS
  356. ;
  357. ;
  358. ;
  359. ; SCREEN DUMP COMPLETED -
  360. FINI STA XFRFLGS ;RESTORE USER XFR OPTION
  361.  LDA #ESC
  362.  JSR OUTPUT
  363.  LDA #ASCIIA
  364.  JSR OUTPUT
  365.  LDA #CR
  366.  JSR OUTPUT
  367.  LDA #LF
  368.  JSR OUTPUT
  369.  LDA #ESC
  370.  JSR OUTPUT
  371.  LDA #ASCIID
  372.  JSR OUTPUT
  373.  LDA #NUL
  374.  JSR OUTPUT
  375.  LDA #$20
  376.  JSR OUTPUT
  377.  LDA OFFSET
  378.  LSR
  379.  LSR
  380.  LSR
  381.  LSR
  382.  TAY
  383.  LDA $7F8,Y ;THIS TURNS AUTO LINE FEEDS
  384.  AND #$EF ;BACK ON THE SUPER SERIAL CARD
  385.  ORA #$01
  386.  STA $7F8,Y
  387.  JSR DOSCONN
  388.  RTS
  389. *
  390. OUTPUT EQU * ;THIS HANDLES OUTPUT FOR SELECTED CARD
  391.  LDY OFFSET ;THIS IS FOR PASCAL 1 PROTOCOL
  392.  LDX SIGBYTES+1 ;SAME HERE....
  393.  JMP (OUTL) ;BRIDGE FOR JSR OUTPUT
  394. *
  395. PPOUT EQU * ;MARK THE SPOT HERE
  396.  STA PPDATA,Y ;STORE IT IN THE DATA PORT
  397. NOTRDY LDA PPSTAT,Y ;GET THE PARALLEL STATUS REGISTER
  398.  AND #$80 ;CHECK TO SEE IF IT'S BUSY
  399.  BEQ NOTRDY ;WAIT HERE IF IT IS
  400.  RTS  ;AND RETURN
  401. *
  402. FINDTYPE EQU * ;SUBROUTINE TO FIND THE INTERFACE CARD
  403.  TYA  ;GET SLOT FROM Y REGISTER
  404.  STA SLOT ;STORE IT FOR A MOMENT
  405.  ASL  ;SHIFT IT 4 TIMES
  406.  ASL
  407.  ASL
  408.  ASL  ;
  409.  STA OFFSET ;STORE IT FOR LATER USE
  410.  STX XFRFLGS ;X REGISTER CONTAINS THE PRINT OPTION
  411.  LDA #$00 ;
  412.  STA SIGBYTES ;SET UP ZERO PAGE FOR CALCULATION
  413.  LDA SLOT ;GET THE SLOT AGAIN
  414.  AND #$07 ;ONLY NEED THE LAST THREE BITS
  415.  ORA #$C0 ;MAKE THE HIGH BYTE OF CN00
  416.  STA SIGBYTES+1 ;STORE IT THE HIGH BYTE OF CN00
  417.  LDY #5 ;LOOKING FOR PASCAL 1 PROTOCOL
  418.  LDA (SIGBYTES),Y ;CHECK BYTE CN05 FOR PASCAL 1
  419.  CMP #$38 ;CHECK #1
  420.  BNE PARAPNT
  421.  LDY #7 ;CHECK BYTE CN07 FOR PASCAL 1
  422.  LDA (SIGBYTES),Y ;
  423.  CMP #$18 ;CHECK #2
  424.  BNE PARAPNT
  425.  LDY #$B ;CHECK THE GENERIC SIGBYTE
  426.  LDA (SIGBYTES),Y ;DOING IT
  427.  CMP #$01 ;CHECK #3
  428.  BEQ PASCAL1 ;LOOKS LIKE PASCAL 1 TO ME....
  429.  BNE PARAPNT
  430. PASCAL1 EQU *
  431.  LDY #$0D ;GET THE INITILIZATION OFFSET
  432.  LDA (SIGBYTES),Y ;DOING THE TASK....
  433.  STA OUTL ;PUT IT IN THE LOWER HOOK BYTE..
  434.  LDA SIGBYTES+1 ;GET THE HIGH BYTE OF CN00
  435.  STA OUTH ;PUT IT IN THE HIGH HOOK BYTE..
  436.  JSR OUTPUT ;TURN THE CARD ON...
  437.  LDY #$F ;GET THE WRITE OFFSET BYTE..
  438.  LDA (SIGBYTES),Y ;WORKING AGAIN....
  439.  STA OUTL ;PUT IT AT THE LOWER HOOK BYTE
  440.  LDY #$0C ;CHECK THE DEVICE SIGBYTE
  441.  LDA (SIGBYTES),Y ;HO HUM
  442.  CMP #$31 ;IS IT A SSC CARD?
  443.  BNE RETURN ;NO START THE PROGRAM
  444.  LDA #$9 ;TURN OFF THE COMMAND BYTE
  445.  JSR OUTPUT ;HERE WE GO....
  446.  LDA #'Z' ;ZAP THE MUTHA..
  447.  JSR OUTPUT ;SEND IT TO THE CARD...
  448.  LDA #CR ;DONT FORGET THIS, MANY HEADACHES!!
  449.  JSR OUTPUT ;OUTPUT IT
  450. RETURN RTS  ;RETURN TO CALLER
  451. *
  452. PARAPNT EQU *
  453.  LDY #$A ;THIS IS AS GOOD A PLACE AS ANY TO
  454.  LDA (SIGBYTES),Y ;IDENTIFY THE APPLE PARALLEL INTERFACE
  455.  CMP #$20 ;
  456.  BNE APPLE3 ;
  457.  INY  ;
  458.  LDA (SIGBYTES),Y ;BYTES ARE: CN0A $20, CN0B $58 CN0B $FF
  459.  CMP #$58
  460.  BNE APPLE3
  461.  INY
  462.  LDA (SIGBYTES),Y
  463.  CMP #$FF
  464.  BNE APPLE3
  465.  LDA #>PPOUT ;LOCATION OF THE PARALLEL INTERFACE OUTPUTT
  466.  STA OUTL ;ROUTINE LOCATED SOMEWHERE IN THE PROGRAM
  467.  LDA #<PPOUT ;
  468.  STA OUTH ;
  469.  RTS
  470.  EOR #$10
  471.  AND #$70
  472.  BNE LOOP2
  473.  PLA
  474.  STA $C0F0
  475.  RTS
  476. *
  477. APPLE3 EQU *
  478.  LDA APP3ID
  479.  CMP #$C0
  480.  BNE TROUBLE
  481.  LDY #$B
  482.  LDA (SIGBYTES),Y
  483.  CMP #$08
  484.  BNE TROUBLE
  485.  INY
  486.  LDA (SIGBYTES),Y
  487.  CMP #$48
  488.  BNE TROUBLE
  489.  LDA #7
  490.  JSR OUTPRT
  491.  LDA #0
  492.  JSR COUT
  493.  JSR SETVID
  494.  LDA #THREEOUT
  495.  STA OUTL
  496.  LDA #<THREEOUT
  497.  STA OUTH
  498.  RTS
  499. *
  500. THREEOUT EQU *
  501.  PHA
  502. LOOP2 LDA $C0F1
  503.  EOR #$10
  504.  AND #$70
  505.  BNE LOOP2
  506.  PLA
  507.  STA $C0F0
  508.  RTS
  509. *
  510. TROUBLE EQU *
  511.  LDA #$FF
  512.  STA OFFSET
  513.  PLA
  514.  PLA
  515.  RTS
  516. GrafBas EQU *
  517.  JSR COMBYTE ;USE THE TXTPTR TO GET THE SLOT NUMBER
  518.  TXA
  519.  PHA ;STORE IT ON THE STACK FOR NOW
  520.  JSR COMBYTE ;GET THE PRINT OPTION
  521. ;RETURNED IN THE X REGISTER
  522.  PLA ;GET THE SLOT NUMBER BACK
  523.  TAY ;TRANSFER TO THE Y REGISTER
  524.  JMP GrafML ;ALREADY FOR THE MACHINE LANG ENTRY POINT
  525. *
  526. DOSCONN LDA WARMSTART
  527.  CMP #$4C
  528.  BNE DOSHOOK
  529.  LDA WARMSTART+1
  530.  BNE DOSHOOK
  531.  LDA WARMSTART+2
  532.  CMP #$BE
  533.  BNE DOSHOOK
  534. PRODOSIO LDY #$03
  535. L016 LDA VDOSIO,Y
  536.  STA CSWL,Y
  537.  DEY
  538.  BPL L016
  539.  RTS
  540. DOSHOOK JSR DOSIO
  541.  RTS
  542. TABLE DW $2000,$2080 ;THESE ARE HIRES BASE ADDRESSES
  543.  DW $2100,$2180 ;FOR EACH SET OF EIGHT HIRES ROWS
  544.  DW $2200,$2280
  545.  DW $2300,$2380
  546.  DW $2028,$20A8
  547.  DW $2128,$21A8
  548.  DW $2228,$22A8
  549.  DW $2328,$23A8
  550.  DW $2050,$20D0
  551.  DW $2150,$21D0
  552.  DW $2250,$22D0
  553.  DW $2350,$23D0
  554.